home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Tcl-Tk 8.0 / Pre-installed version / tcl8.0 / win / tclWinError.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-15  |  10.6 KB  |  394 lines  |  [TEXT/CWIE]

  1. /* 
  2.  * tclWinError.c --
  3.  *
  4.  *    This file contains code for converting from Win32 errors to
  5.  *    errno errors.
  6.  *
  7.  * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  *
  12.  * SCCS: @(#) tclWinError.c 1.6 96/10/03 14:59:22
  13.  */
  14.  
  15. #include "tclInt.h"
  16. #include "tclPort.h"
  17.  
  18. /*
  19.  * The following table contains the mapping from Win32 errors to
  20.  * errno errors.
  21.  */
  22.  
  23. static char errorTable[] = {
  24.     0,
  25.     EINVAL,    /* ERROR_INVALID_FUNCTION    1 */
  26.     ENOENT,    /* ERROR_FILE_NOT_FOUND        2 */
  27.     ENOENT,    /* ERROR_PATH_NOT_FOUND        3 */
  28.     EMFILE,    /* ERROR_TOO_MANY_OPEN_FILES    4 */
  29.     EACCES,    /* ERROR_ACCESS_DENIED        5 */
  30.     EBADF,    /* ERROR_INVALID_HANDLE        6 */
  31.     ENOMEM,    /* ERROR_ARENA_TRASHED        7 */
  32.     ENOMEM,    /* ERROR_NOT_ENOUGH_MEMORY    8 */
  33.     ENOMEM,    /* ERROR_INVALID_BLOCK        9 */
  34.     E2BIG,    /* ERROR_BAD_ENVIRONMENT    10 */
  35.     ENOEXEC,    /* ERROR_BAD_FORMAT        11 */
  36.     EACCES,    /* ERROR_INVALID_ACCESS        12 */
  37.     EINVAL,    /* ERROR_INVALID_DATA        13 */
  38.     EFAULT,    /* ERROR_OUT_OF_MEMORY        14 */
  39.     ENOENT,    /* ERROR_INVALID_DRIVE        15 */
  40.     EACCES,    /* ERROR_CURRENT_DIRECTORY    16 */
  41.     EXDEV,    /* ERROR_NOT_SAME_DEVICE    17 */
  42.     ENOENT,    /* ERROR_NO_MORE_FILES        18 */
  43.     EROFS,    /* ERROR_WRITE_PROTECT        19 */
  44.     ENXIO,    /* ERROR_BAD_UNIT        20 */
  45.     EBUSY,    /* ERROR_NOT_READY        21 */
  46.     EIO,    /* ERROR_BAD_COMMAND        22 */
  47.     EIO,    /* ERROR_CRC            23 */
  48.     EIO,    /* ERROR_BAD_LENGTH        24 */
  49.     EIO,    /* ERROR_SEEK            25 */
  50.     EIO,    /* ERROR_NOT_DOS_DISK        26 */
  51.     ENXIO,    /* ERROR_SECTOR_NOT_FOUND    27 */
  52.     EBUSY,    /* ERROR_OUT_OF_PAPER        28 */
  53.     EIO,    /* ERROR_WRITE_FAULT        29 */
  54.     EIO,    /* ERROR_READ_FAULT        30 */
  55.     EIO,    /* ERROR_GEN_FAILURE        31 */
  56.     EACCES,    /* ERROR_SHARING_VIOLATION    32 */
  57.     EACCES,    /* ERROR_LOCK_VIOLATION        33 */
  58.     ENXIO,    /* ERROR_WRONG_DISK        34 */
  59.     ENFILE,    /* ERROR_FCB_UNAVAILABLE    35 */
  60.     ENFILE,    /* ERROR_SHARING_BUFFER_EXCEEDED    36 */
  61.     EINVAL,    /* 37 */
  62.     EINVAL,    /* 38 */
  63.     ENOSPC,    /* ERROR_HANDLE_DISK_FULL    39 */
  64.     EINVAL,    /* 40 */
  65.     EINVAL,    /* 41 */
  66.     EINVAL,    /* 42 */
  67.     EINVAL,    /* 43 */
  68.     EINVAL,    /* 44 */
  69.     EINVAL,    /* 45 */
  70.     EINVAL,    /* 46 */
  71.     EINVAL,    /* 47 */
  72.     EINVAL,    /* 48 */
  73.     EINVAL,    /* 49 */
  74.     ENODEV,    /* ERROR_NOT_SUPPORTED        50 */
  75.     EBUSY,    /* ERROR_REM_NOT_LIST        51 */
  76.     EEXIST,    /* ERROR_DUP_NAME        52 */
  77.     ENOENT,    /* ERROR_BAD_NETPATH        53 */
  78.     EBUSY,    /* ERROR_NETWORK_BUSY        54 */
  79.     ENODEV,    /* ERROR_DEV_NOT_EXIST        55 */
  80.     EAGAIN,    /* ERROR_TOO_MANY_CMDS        56 */
  81.     EIO,    /* ERROR_ADAP_HDW_ERR        57 */
  82.     EIO,    /* ERROR_BAD_NET_RESP        58 */
  83.     EIO,    /* ERROR_UNEXP_NET_ERR        59 */
  84.     EINVAL,    /* ERROR_BAD_REM_ADAP        60 */
  85.     EFBIG,    /* ERROR_PRINTQ_FULL        61 */
  86.     ENOSPC,    /* ERROR_NO_SPOOL_SPACE        62 */
  87.     ENOENT,    /* ERROR_PRINT_CANCELLED    63 */
  88.     ENOENT,    /* ERROR_NETNAME_DELETED    64 */
  89.     EACCES,    /* ERROR_NETWORK_ACCESS_DENIED    65 */
  90.     ENODEV,    /* ERROR_BAD_DEV_TYPE        66 */
  91.     ENOENT,    /* ERROR_BAD_NET_NAME        67 */
  92.     ENFILE,    /* ERROR_TOO_MANY_NAMES        68 */
  93.     EIO,    /* ERROR_TOO_MANY_SESS        69 */
  94.     EAGAIN,    /* ERROR_SHARING_PAUSED        70 */
  95.     EINVAL,    /* ERROR_REQ_NOT_ACCEP        71 */
  96.     EAGAIN,    /* ERROR_REDIR_PAUSED        72 */
  97.     EINVAL,    /* 73 */
  98.     EINVAL,    /* 74 */
  99.     EINVAL,    /* 75 */
  100.     EINVAL,    /* 76 */
  101.     EINVAL,    /* 77 */
  102.     EINVAL,    /* 78 */
  103.     EINVAL,    /* 79 */
  104.     EEXIST,    /* ERROR_FILE_EXISTS        80 */
  105.     EINVAL,    /* 81 */
  106.     ENOSPC,    /* ERROR_CANNOT_MAKE        82 */
  107.     EIO,    /* ERROR_FAIL_I24        83 */
  108.     ENFILE,    /* ERROR_OUT_OF_STRUCTURES    84 */
  109.     EEXIST,    /* ERROR_ALREADY_ASSIGNED    85 */
  110.     EPERM,    /* ERROR_INVALID_PASSWORD    86 */
  111.     EINVAL,    /* ERROR_INVALID_PARAMETER    87 */
  112.     EIO,    /* ERROR_NET_WRITE_FAULT    88 */
  113.     EAGAIN,    /* ERROR_NO_PROC_SLOTS        89 */
  114.     EINVAL,    /* 90 */
  115.     EINVAL,    /* 91 */
  116.     EINVAL,    /* 92 */
  117.     EINVAL,    /* 93 */
  118.     EINVAL,    /* 94 */
  119.     EINVAL,    /* 95 */
  120.     EINVAL,    /* 96 */
  121.     EINVAL,    /* 97 */
  122.     EINVAL,    /* 98 */
  123.     EINVAL,    /* 99 */
  124.     EINVAL,    /* 100 */
  125.     EINVAL,    /* 101 */
  126.     EINVAL,    /* 102 */
  127.     EINVAL,    /* 103 */
  128.     EINVAL,    /* 104 */
  129.     EINVAL,    /* 105 */
  130.     EINVAL,    /* 106 */
  131.     EXDEV,    /* ERROR_DISK_CHANGE        107 */
  132.     EAGAIN,    /* ERROR_DRIVE_LOCKED        108 */
  133.     EPIPE,    /* ERROR_BROKEN_PIPE        109 */
  134.     ENOENT,    /* ERROR_OPEN_FAILED        110 */
  135.     EINVAL,    /* ERROR_BUFFER_OVERFLOW    111 */
  136.     ENOSPC,    /* ERROR_DISK_FULL        112 */
  137.     EMFILE,    /* ERROR_NO_MORE_SEARCH_HANDLES    113 */
  138.     EBADF,    /* ERROR_INVALID_TARGET_HANDLE    114 */
  139.     EFAULT,    /* ERROR_PROTECTION_VIOLATION    115 */
  140.     EINVAL,    /* 116 */
  141.     EINVAL,    /* 117 */
  142.     EINVAL,    /* 118 */
  143.     EINVAL,    /* 119 */
  144.     EINVAL,    /* 120 */
  145.     EINVAL,    /* 121 */
  146.     EINVAL,    /* 122 */
  147.     ENOENT,    /* ERROR_INVALID_NAME        123 */
  148.     EINVAL,    /* 124 */
  149.     EINVAL,    /* 125 */
  150.     EINVAL,    /* 126 */
  151.     ESRCH,    /* ERROR_PROC_NOT_FOUND        127 */
  152.     ECHILD,    /* ERROR_WAIT_NO_CHILDREN    128 */
  153.     ECHILD,    /* ERROR_CHILD_NOT_COMPLETE    129 */
  154.     EBADF,    /* ERROR_DIRECT_ACCESS_HANDLE    130 */
  155.     EINVAL,    /* 131 */
  156.     ESPIPE,    /* ERROR_SEEK_ON_DEVICE        132 */
  157.     EINVAL,    /* 133 */
  158.     EINVAL,    /* 134 */
  159.     EINVAL,    /* 135 */
  160.     EINVAL,    /* 136 */
  161.     EINVAL,    /* 137 */
  162.     EINVAL,    /* 138 */
  163.     EINVAL,    /* 139 */
  164.     EINVAL,    /* 140 */
  165.     EINVAL,    /* 141 */
  166.     EAGAIN,    /* ERROR_BUSY_DRIVE        142 */
  167.     EINVAL,    /* 143 */
  168.     EINVAL,    /* 144 */
  169.     EEXIST,    /* ERROR_DIR_NOT_EMPTY        145 */
  170.     EINVAL,    /* 146 */
  171.     EINVAL,    /* 147 */
  172.     EINVAL,    /* 148 */
  173.     EINVAL,    /* 149 */
  174.     EINVAL,    /* 150 */
  175.     EINVAL,    /* 151 */
  176.     EINVAL,    /* 152 */
  177.     EINVAL,    /* 153 */
  178.     EINVAL,    /* 154 */
  179.     EINVAL,    /* 155 */
  180.     EINVAL,    /* 156 */
  181.     EINVAL,    /* 157 */
  182.     EACCES,    /* ERROR_NOT_LOCKED        158 */
  183.     EINVAL,    /* 159 */
  184.     EINVAL,    /* 160 */
  185.     ENOENT,    /* ERROR_BAD_PATHNAME            161 */
  186.     EINVAL,    /* 162 */
  187.     EINVAL,    /* 163 */
  188.     EINVAL,    /* 164 */
  189.     EINVAL,    /* 165 */
  190.     EINVAL,    /* 166 */
  191.     EACCES,    /* ERROR_LOCK_FAILED        167 */
  192.     EINVAL,    /* 168 */
  193.     EINVAL,    /* 169 */
  194.     EINVAL,    /* 170 */
  195.     EINVAL,    /* 171 */
  196.     EINVAL,    /* 172 */
  197.     EINVAL,    /* 173 */
  198.     EINVAL,    /* 174 */
  199.     EINVAL,    /* 175 */
  200.     EINVAL,    /* 176 */
  201.     EINVAL,    /* 177 */
  202.     EINVAL,    /* 178 */
  203.     EINVAL,    /* 179 */
  204.     EINVAL,    /* 180 */
  205.     EINVAL,    /* 181 */
  206.     EINVAL,    /* 182 */
  207.     EEXIST,    /* ERROR_ALREADY_EXISTS        183 */
  208.     ECHILD,    /* ERROR_NO_CHILD_PROCESS    184 */
  209.     EINVAL,    /* 185 */
  210.     EINVAL,    /* 186 */
  211.     EINVAL,    /* 187 */
  212.     EINVAL,    /* 188 */
  213.     EINVAL,    /* 189 */
  214.     EINVAL,    /* 190 */
  215.     EINVAL,    /* 191 */
  216.     EINVAL,    /* 192 */
  217.     EINVAL,    /* 193 */
  218.     EINVAL,    /* 194 */
  219.     EINVAL,    /* 195 */
  220.     EINVAL,    /* 196 */
  221.     EINVAL,    /* 197 */
  222.     EINVAL,    /* 198 */
  223.     EINVAL,    /* 199 */
  224.     EINVAL,    /* 200 */
  225.     EINVAL,    /* 201 */
  226.     EINVAL,    /* 202 */
  227.     EINVAL,    /* 203 */
  228.     EINVAL,    /* 204 */
  229.     EINVAL,    /* 205 */
  230.     ENAMETOOLONG,/* ERROR_FILENAME_EXCED_RANGE    206 */
  231.     EINVAL,    /* 207 */
  232.     EINVAL,    /* 208 */
  233.     EINVAL,    /* 209 */
  234.     EINVAL,    /* 210 */
  235.     EINVAL,    /* 211 */
  236.     EINVAL,    /* 212 */
  237.     EINVAL,    /* 213 */
  238.     EINVAL,    /* 214 */
  239.     EINVAL,    /* 215 */
  240.     EINVAL,    /* 216 */
  241.     EINVAL,    /* 217 */
  242.     EINVAL,    /* 218 */
  243.     EINVAL,    /* 219 */
  244.     EINVAL,    /* 220 */
  245.     EINVAL,    /* 221 */
  246.     EINVAL,    /* 222 */
  247.     EINVAL,    /* 223 */
  248.     EINVAL,    /* 224 */
  249.     EINVAL,    /* 225 */
  250.     EINVAL,    /* 226 */
  251.     EINVAL,    /* 227 */
  252.     EINVAL,    /* 228 */
  253.     EINVAL,    /* 229 */
  254.     EPIPE,    /* ERROR_BAD_PIPE        230 */
  255.     EAGAIN,    /* ERROR_PIPE_BUSY        231 */
  256.     EINVAL,    /* 232 */
  257.     EPIPE,    /* ERROR_PIPE_NOT_CONNECTED    233 */
  258.     EINVAL,    /* 234 */
  259.     EINVAL,    /* 235 */
  260.     EINVAL,    /* 236 */
  261.     EINVAL,    /* 237 */
  262.     EINVAL,    /* 238 */
  263.     EINVAL,    /* 239 */
  264.     EINVAL,    /* 240 */
  265.     EINVAL,    /* 241 */
  266.     EINVAL,    /* 242 */
  267.     EINVAL,    /* 243 */
  268.     EINVAL,    /* 244 */
  269.     EINVAL,    /* 245 */
  270.     EINVAL,    /* 246 */
  271.     EINVAL,    /* 247 */
  272.     EINVAL,    /* 248 */
  273.     EINVAL,    /* 249 */
  274.     EINVAL,    /* 250 */
  275.     EINVAL,    /* 251 */
  276.     EINVAL,    /* 252 */
  277.     EINVAL,    /* 253 */
  278.     EINVAL,    /* 254 */
  279.     EINVAL,    /* 255 */
  280.     EINVAL,    /* 256 */
  281.     EINVAL,    /* 257 */
  282.     EINVAL,    /* 258 */
  283.     EINVAL,    /* 259 */
  284.     EINVAL,    /* 260 */
  285.     EINVAL,    /* 261 */
  286.     EINVAL,    /* 262 */
  287.     EINVAL,    /* 263 */
  288.     EINVAL,    /* 264 */
  289.     EINVAL,    /* 265 */
  290.     EINVAL,    /* 266 */
  291.     ENOTDIR,    /* ERROR_DIRECTORY        267 */
  292. };
  293.  
  294. static const unsigned int tableLen = sizeof(errorTable);
  295.  
  296. /*
  297.  * The following table contains the mapping from WinSock errors to
  298.  * errno errors.
  299.  */
  300.  
  301. static int wsaErrorTable[] = {
  302.     EWOULDBLOCK,    /* WSAEWOULDBLOCK */
  303.     EINPROGRESS,    /* WSAEINPROGRESS */
  304.     EALREADY,        /* WSAEALREADY */
  305.     ENOTSOCK,        /* WSAENOTSOCK */
  306.     EDESTADDRREQ,    /* WSAEDESTADDRREQ */
  307.     EMSGSIZE,        /* WSAEMSGSIZE */
  308.     EPROTOTYPE,        /* WSAEPROTOTYPE */
  309.     ENOPROTOOPT,    /* WSAENOPROTOOPT */
  310.     EPROTONOSUPPORT,    /* WSAEPROTONOSUPPORT */
  311.     ESOCKTNOSUPPORT,    /* WSAESOCKTNOSUPPORT */
  312.     EOPNOTSUPP,        /* WSAEOPNOTSUPP */
  313.     EPFNOSUPPORT,    /* WSAEPFNOSUPPORT */
  314.     EAFNOSUPPORT,    /* WSAEAFNOSUPPORT */
  315.     EADDRINUSE,        /* WSAEADDRINUSE */
  316.     EADDRNOTAVAIL,    /* WSAEADDRNOTAVAIL */
  317.     ENETDOWN,        /* WSAENETDOWN */
  318.     ENETUNREACH,    /* WSAENETUNREACH */
  319.     ENETRESET,        /* WSAENETRESET */
  320.     ECONNABORTED,    /* WSAECONNABORTED */
  321.     ECONNRESET,        /* WSAECONNRESET */
  322.     ENOBUFS,        /* WSAENOBUFS */
  323.     EISCONN,        /* WSAEISCONN */
  324.     ENOTCONN,        /* WSAENOTCONN */
  325.     ESHUTDOWN,        /* WSAESHUTDOWN */
  326.     ETOOMANYREFS,    /* WSAETOOMANYREFS */
  327.     ETIMEDOUT,        /* WSAETIMEDOUT */
  328.     ECONNREFUSED,    /* WSAECONNREFUSED */
  329.     ELOOP,        /* WSAELOOP */
  330.     ENAMETOOLONG,    /* WSAENAMETOOLONG */
  331.     EHOSTDOWN,        /* WSAEHOSTDOWN */
  332.     EHOSTUNREACH,    /* WSAEHOSTUNREACH */
  333.     ENOTEMPTY,        /* WSAENOTEMPTY */
  334.     EAGAIN,        /* WSAEPROCLIM */
  335.     EUSERS,        /* WSAEUSERS */
  336.     EDQUOT,        /* WSAEDQUOT */
  337.     ESTALE,        /* WSAESTALE */
  338.     EREMOTE,        /* WSAEREMOTE */
  339. };
  340.  
  341. /*
  342.  *----------------------------------------------------------------------
  343.  *
  344.  * TclWinConvertError --
  345.  *
  346.  *    This routine converts a Win32 error into an errno value.
  347.  *
  348.  * Results:
  349.  *    None.
  350.  *
  351.  * Side effects:
  352.  *    Sets the errno global variable.
  353.  *
  354.  *----------------------------------------------------------------------
  355.  */
  356.  
  357. void
  358. TclWinConvertError(errCode)
  359.     DWORD errCode;        /* Win32 error code. */
  360. {
  361.     if (errCode >= tableLen) {
  362.     Tcl_SetErrno(EINVAL);
  363.     } else {
  364.     Tcl_SetErrno(errorTable[errCode]);
  365.     }
  366. }
  367.  
  368. /*
  369.  *----------------------------------------------------------------------
  370.  *
  371.  * TclWinConvertWSAError --
  372.  *
  373.  *    This routine converts a WinSock error into an errno value.
  374.  *
  375.  * Results:
  376.  *    None.
  377.  *
  378.  * Side effects:
  379.  *    Sets the errno global variable.
  380.  *
  381.  *----------------------------------------------------------------------
  382.  */
  383.  
  384. void
  385. TclWinConvertWSAError(errCode)
  386.     DWORD errCode;        /* Win32 error code. */
  387. {
  388.     if ((errCode >= WSAEWOULDBLOCK) && (errCode <= WSAEREMOTE)) {
  389.     Tcl_SetErrno(wsaErrorTable[errCode - WSAEWOULDBLOCK]);
  390.     } else {
  391.     Tcl_SetErrno(EINVAL);
  392.     }
  393. }
  394.